/* eslint-disable */
import {hiprint} from 'vue-plugin-hiprint'


let Modal = [];
let printData = {};
let jadeCount = 0;// 用来统计生成几个货品表格，每个不同入库单都有自己独立的几个货品，要分开数据放
/*
  注意！
  所有api底下的Provider.js全部由inbound底下的orderProvider.js复制粘贴过来修改一部分，所以可能有冗余代码
  需要打印的字段及翻译字段(如果你不想自己设计代码，只是想添加几个新的属性生成标签来用，往rules塞入库单的那一系列属性)
  如果属性是来自入库单底下的货品，往rulesChild塞，属性值是标签名而已，其它都不用动我都是遍历添加的，当然，如果该属性
  没有任何值连""都不是就只是null，那么不会生成标签，说明你压根用不到，记住，传入的入库单参数只能有一个数组，且这个
  数组是货品数组，因为我只设计了一个数组检测，我设计的不是属性是否==='属性名',而是Array.isArray就直接进行货品数组处理

  这块代码可能乱点，因为我是赶工做出来的
*/
const rules = {
  createBy: "入库人员",
  createTime: "入库时间",
  inboundOrderCode: "入库单编号",
  jadeBarcode: "翡翠条码",
  jadeCode: "翡翠编码",
  jadeCost: "成本价格",
  jadeCostCipher: "成本价暗码",
  jadeName: "翡翠名称",
  jadeTagPrice: "标签价格",
  jadeTagPriceCipher: "标签价暗码",
  jadeTypeName: "翡翠品类",
  orderType: "入库类型",
  remark: "备注",
  storageCode: "入库仓位编码",
  storageName: "入库仓位名称",
  warehouseCode: "仓库编码",
  warehouseName: "仓库名称"
};

// 如果货品有子数组参数就可以用到这个，没有就不用管
const rulesChild = {
  
};

export { printData };

export function generateDynamicStructure(options) { // 动态生成表格
  const fields = [];
  const columns = [];

  for (const [field, text] of Object.entries(options)) {
    fields.push({ text, field });
    columns.push({ title: text, align: 'center', field, width: 100 });
  }

  return { fields, columns: [columns] };
}

export function creatModal(options){
  // 最后返回的模板数组
  var arr = [];
  // 塞两个辅助模板
  arr.push(
    new hiprint.PrintElementTypeGroup("辅助", [
      {
        tid: 'goods.hline',
        title: '横线',
        type: 'hline'
      },
      {
        tid: 'goods.vline',
        title: '竖线',
        type: 'vline'
      },
      {
        tid: 'goods.rect',
        title: '矩形',
        type: 'rect'
      },
      {
        tid: 'goods.oval',
        title: '椭圆',
        type: 'oval'
      }
    ])
  )
  arr.push(
    new hiprint.PrintElementTypeGroup("其他", [
      
      {tid: 'goods.customText', title: '文本',  type: 'text'},
      {
        tid: 'goods.longText', title: '长文本', type: 'longText', options: {
          width: 200,
          testData: '长文本分页/不分页测试'
        },
      }
    ])
  )

  // 塞入库单表格和货品表格
  var table = [];
  const { fields, columns } = generateDynamicStructure(rules);

  table.push({
    tid: 'goods.table',
    title: '入库单数据表格',
    type: 'table',
    options: {
      field: 'table',
      fields: fields,
    },
    editable: true,
    columnDisplayEditable: true,
    columnDisplayIndexEditable: true,
    columnTitleEditable: true,
    columnResizable: true,
    columnAlignEditable: true,
    columns: columns,
  });

  for (let index = 1; index <= jadeCount; index++) {
    const { fields, columns } = generateDynamicStructure(rulesChild);
    table.push({
      tid: `goods.tableChild${index}`,
      title: `入库单${index}的货品表格`,
      type: 'table',
      options: {
        field: `tableChild${index}`,
        fields: fields,
      },
      editable: true,
      columnDisplayEditable: true,
      columnDisplayIndexEditable: true,
      columnTitleEditable: true,
      columnResizable: true,
      columnAlignEditable: true,
      columns: columns,
    });
  }
  
  arr.push(new hiprint.PrintElementTypeGroup("表格数据",table))

  arr.push(...options);
  return arr;
}

// 处理传入的参数动态生成设计元素
export function createElementTypes(options) {
  printData = {}; //每次重新生成都需要删除一遍数据
  jadeCount = 0;
  // count用来命名模板名字一起区别field，每行数据的模板名不一样，每个模板内的设计元素的field要区别
  let count = 1;
  // 这个用来放所有模板
  let allModalArray = [];
  // 表格数组
  let tableArray = [];
  let tableChildArray = [];
  options.forEach(opt => {
    // 进行深拷贝,好像也没必要(确实没必要，如果数据不是从参数那拿而是从某个js文件里拿的就需要，不能污染原js数据，但不管了保留也没事)
    let item = JSON.parse(JSON.stringify(opt))
    // 模板数组
    let modalArray = [];
    // 待处理数组
    let nonSolveChildren;
    // 表格数组内的对象元素，具体你看看print-data.js格式就知道我为什么要这么写
    let tableElement = {};
    // 将入库单的属性进行变成设计元素格式
    for(const key in item){
      if (!Array.isArray(item[key]) && item[key] !== null && key in rules) { // 如果 key 不是数组 且值不为null
        const translatedTitle = rules[key] || key; //翻译
        printData[`${key}${count}`] = item[key]; //这个是单独标签拖拽用的数据,`${key}${count}`是field
        tableElement[`${key}`] = item[key];// 这个是表格填充数据，之后要把整个表格放到printData的
        modalArray.push({
          tid: `goods.${key}${count}`,// tid需要是唯一的
          title: translatedTitle,
          data: translatedTitle,
          type: 'text',
          options: {
            field: `${key}${count}`,
            testData: translatedTitle,
            height: 17,
            fontSize: 16.5,
            fontWeight: "700",
            textAlign: "center",
            hideTitle: true
          }
        });
        if(/code|Code/.test(key)){ //key字符串包含单词code或者Code则生成二维码和条形码
          modalArray.push({
            tid: `goods.${key}${count}.qrcode`,// tid需要是唯一的
            text: `${translatedTitle}二维码`,
            type: 'text',
            options: {
              field: `${key}${count}`, //这个用同一个数据就行
              testData: "XS888888888", // 不能写中文，就随便写一串当展示样板
              height: 17,
              fontSize: 16.5,
              fontWeight: "700",
              textAlign: "center",
              textType: "qrcode"
            }
          });
          modalArray.push({
            tid: `goods.${key}${count}.barcode`,// tid需要是唯一的
            text: `${translatedTitle}条形码`,
            type: 'text',
            options: {
              field: `${key}${count}`, //这个用同一个数据就行
              testData: "XS888888888", // 不能写中文，就随便写一串当展示样板
              height: 17,
              fontSize: 16.5,
              fontWeight: "700",
              textAlign: "center",
              textType: "barcode"
            }
          });
        }
      } else if (Array.isArray(item[key]) && item[key] !== null ) {
        jadeCount++;// 有货品数组就自增一次
        nonSolveChildren = item[key];
      }
    }
    // 把表格数据填充
    tableArray.push(tableElement)
    // console.log(modalArray);
    // 把处理好的模板塞到数组
    allModalArray.push(
      new hiprint.PrintElementTypeGroup(`入库单${count}`, modalArray)
    )
    if(Array.isArray(nonSolveChildren) && nonSolveChildren.length > 0){ // 如果有待处理单底下的货品明细
      let countChild = 1;
      tableChildArray = [];// 这个就某入库单底下所有货品数据表格
      nonSolveChildren.forEach(opt => {
        let tableChildElement = {}; // 一个货品的每个参数数据
        modalArray = [];
        for(const key in opt){
          if (!Array.isArray(opt[key]) && opt[key] !== null && key in rulesChild) { // 如果 key 不是数组 且值不为null
            const translatedTitle = rulesChild[key] || key; // 翻译
            printData[`${key}${count}.${countChild}`] = opt[key] // 这两段跟上面一样都是数据填充
            tableChildElement[`${key}`] = opt[key]
            modalArray.push({
              tid: `goods.${key}${count}.${countChild}`,
              title: translatedTitle,
              data: translatedTitle,
              type: 'text',
              options: {
                field: `${key}${count}.${countChild}`,
                testData: translatedTitle,
                height: 17,
                fontSize: 16.5,
                fontWeight: "700",
                textAlign: "center",
                hideTitle: true
              }
            });
            if(/code|Code/.test(key)){ //key字符串包含单词code或者Code则生成二维码和条形码
              modalArray.push({
                tid: `goods.${key}${count}.${countChild}.qrcode`,// tid需要是唯一的
                text: `${translatedTitle}二维码`,
                type: 'text',
                options: {
                  field: `${key}${count}.${countChild}`, //这个用同一个数据就行
                  testData: "XS888888888", // 不能写中文，就随便写一串当展示样板
                  height: 17,
                  fontSize: 16.5,
                  fontWeight: "700",
                  textAlign: "center",
                  textType: "qrcode"
                }
              });
              modalArray.push({
                tid: `goods.${key}${count}.${countChild}.barcode`,// tid需要是唯一的
                text: `${translatedTitle}条形码`,
                type: 'text',
                options: {
                  field: `${key}${count}.${countChild}`, //这个用同一个数据就行
                  testData: "XS888888888", // 不能写中文，就随便写一串当展示样板
                  height: 17,
                  fontSize: 16.5,
                  fontWeight: "700",
                  textAlign: "center",
                  textType: "barcode"
                }
              });
            }
          }
        }
        tableChildArray.push(tableChildElement)
        allModalArray.push(
          new hiprint.PrintElementTypeGroup(`入库单${count}的货品${countChild}`, modalArray)
        )
        countChild++;
      })
    }
    count++;
    printData[`tableChild${jadeCount}`] = tableChildArray
  });
  printData['table'] = tableArray;
  // console.log(options);
  Modal = creatModal(allModalArray);
}

// 自定义设计元素1
export const Provider = function (ops) {
  
  var addElementTypes = function (context) {
    context.removePrintElementTypes("goodsProviderModule");
    context.addPrintElementTypes(
      "goodsProviderModule", Modal
    );
  };
  return {
    addElementTypes: addElementTypes
  };
};
export default [{
  name: 'inbound.goods',//name被我用来作为localstorage来保存每个页面自定义的json模板
  value: 'goodsProviderModule',
  type: 1,
  f: Provider()
}]
